#include <iostream>
#include <memory>
#include "TcpServer.hpp"
#include "Calculate.hpp"
#include "Daemon.hpp"

using namespace Net_Work;
using namespace Protocol;
using namespace CalCulateNS;
// 服务器对业务的处理逻辑
std::string HandlerRequest(std::string &inbufferstream, bool *ok) // inbufferstream : "len\nx op y\n"
{
    // 1.定义计算的对象
    Calculate calculate;

    // 2.构建响应对象
    std::unique_ptr<Factory> factory = std::make_unique<Factory>();
    auto req = factory->BuildRequest();

    // 3. 分析字节流，是否有完整的报文

    std::string message;
    std::string total_string;
    while (Decode(inbufferstream, &message)) // 一直进行分析字节流，直到inbufferstream中不存在一个完整的报文
    {
        // 4.已经读取到了完整的报文了，进行反序列化
        if (!req->Deserialize(message))
        {
            *ok = false;
            return std::string();
        }

        // 5.进行业务处理
        auto resp = calculate.Cal(req);

        // 6.处理的结果需要序列化，把结果交给客户端
        std::string send_string;
        resp->Serializate(&send_string);

        // 6.构建完成的字符串级别的报文  "len\nresult code\n"
        send_string = Encode(send_string);
        total_string += send_string;
    }

    return total_string;
}
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage: " << argv[0] << " serverport" << std::endl;
        return 1;
    }

    uint16_t localport = std::stoi(argv[1]);
    Daemon(false, false);
    std::unique_ptr<TcpServer> tvr(new TcpServer(localport, HandlerRequest));
    tvr->Loop();

    return 0;
}